package com.dylan.历史.跟书.effectivejava.item01服务提供者框架;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @author : ankang
 * @date : 2019/5/26 20:56
 * @Description : 服务者注册API，及服务访问API
 */
public class Services {
    private Services() {}

    /**
     * 保存服务名称到服务提供者的映射
     */
    private static final Map<String, Provider> providers = new ConcurrentHashMap<>();

    /**
     * 默认服务提供者名称
     */
    private static final String DEFAULT_PROVIDER_NAME = "<def>";

    public static void registerDefaultProvider(Provider provider) {
        registerProvider(DEFAULT_PROVIDER_NAME, provider);
    }

    /**
     * 注册服务提供者
     * @param name 服务提供者名称
     * @param provider 服务提供者
     */
    public static void registerProvider(String name, Provider provider) {
        providers.put(name, provider);
    }

    public static Service newInstance() {
        return newInstance(DEFAULT_PROVIDER_NAME);
    }

    /**
     * 获取服务实例
     * @param name 服务名称
     * @return 服务实例
     */
    public static Service newInstance(String name) {
        Provider provider = providers.get(name);
        if (provider == null) {
            throw new IllegalArgumentException("No provider registered with name: " + name);
        }
        return provider.newService();
    }
}
